// 报错：TypeError: user.push is not a function

// ////////////////////////////////////
console.log("// ////////////////////////////////////")

// 可以将类（伪）数组转为数组，使用 Array.from 方法
// 将 arguments 转为标准数组
function foo2() {
    let arr = Array.from(arguments);
    console.log(arr);  // [ 1, 2, 3 ]
    console.log(arr.length);  // 3
    arr.push("1");
    console.log(arr);  // [ 1, 2, 3, '1' ]
}

foo2(1, 2, 3);

// 将类似数组的对象转为标准数组
let user_arr = Array.from(user);
console.log(user_arr);  // [ 'John', 30 ]
console.log(user_arr.length);  // 2
user_arr.push("1");
console.log(user_arr);  // [ 'John', 30, '1' ]

// 使用 Array.of 可以将一组数据转换为数组
let arr = Array.of(1, 2, 3);
console.log(arr);  // [ 1, 2, 3 ]


// 扩展：Array() 方法介绍
// 使用 Array 方法可以生成一个空的数组空间
let empty_arr = Array(10);
console.log(empty_arr);  // [ <10 empty items> ]

/*
* js 作为一种高级动态语言，数组的存储方式不要求一定在内存中连续存储；
* Array() 方法用于创建“稀疏数组”(Sparse Array)，其中所有的元素都是未定义的“空槽”(empty slots)，且不会为其分配内存空间，只有当添加具体的数据时，才会分配内存空间；
* 稀疏数组具备 length 属性，返回具体的长度，如长度为 3 的稀疏数组查询 length 属性返回 3；但使用下标取值时均为 undefined，而不是 null；
* 对于“密集数组”(Dense Array)，js 引擎可能将其优化为在内存中连续存储的结构；
* 一旦数组中存在“空槽”，则为“稀疏数组”，其存储方式一般为哈希表或类似结构存储，在内存中不连续。
*/

console.log(empty_arr[0]);  // undefined
console.log(empty_arr.length);  // 10